summaryrefslogtreecommitdiff
path: root/init.d/moztmp
blob: 79e74b1325803e8fbd2b14b52ce3df80cfe34e15 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#!/sbin/runscript

opts="save load"

depend() {
    need localmount
    after bootmisc
}

MOZMOUNT=${MOZMOUNT:-/tmp/moztmp/}
MOZDIR=${MOZDIR:-.mozilla}
MOZSAVEDIR=${MOZSAVEDIR:-.mozilla_save}

homedir() {
    echo $(eval echo ~$1)
}

get_size() {
    local size=0
    for u in $USERS; do
        local dir=$(homedir $u)/${MOZDIR}
        if [ -d $dir ]; then
            s=$(du -s $dir | cut -f 1)
            size=$(( size + s ))
        else 
            if [ -e $dir ]; then
                echo "$home is not a directory!"
            
            else
                # save default: 50 MB
                size=$(( size + 51200 ))
            fi
        fi
    done

    size=$(( size * 2 ))
    veinfo "Taking ${size}k as the size."
    
    echo $size
}

set_folder() {
    local user=$1
    local mdir=$(homedir $u)/$MOZDIR
    local sdir=$(homedir $u)/$MOZSAVEDIR
    local mntdir=$MOZMOUNT/$user

    if [ -e $sdir ]; then
        eerror "$sdir already existing. Skipping user $user."
        return 1
    else
        checkpath -d -o $user $mntdir || return 1
      
        if [ -e $mdir ]; then
            mv $mdir $sdir || return 1
        fi
                
        if ! ln -s $mntdir $mdir; then
            rm -f $mdir
            [ -e $sdir ] && mv $sdir $mdir
            eerror "Linking failed"
            return 1
        fi
        
        einfo "Rsyncing"
        if ! rsync -qai --delete $sdir/ $mntdir ; then
            rm -f $mdir
            [ -e $sdir ] && mv $sdir $mdir
            eerror "RSync failed"
            return 1
        fi

    fi

    return 0
}

get_folder() {
    local user=$1
    local mdir=$(homedir $u)/$MOZDIR
    local sdir=$(homedir $u)/$MOZSAVEDIR
    local mntdir=$MOZMOUNT/$user

    if [ ! -L $mdir ]; then
        eerror "$mdir is not a link. Skipping user $user."
        return 1
    else
        rm $mdir
        einfo "Rsyncing"
        rsync -aiq --delete $mntdir/ $sdir/ || return 1
        mv $sdir $mdir
    fi

    return 0
}

save() {
    for u in $USERS; do
        ebegin "Deleting moztmp for user $u"
        eindent
        get_folder $u
        eoutdent
        eend $?
    done

    if yesno $(service_get_value mnted); then
        ebegin "Unmounting ${MOZMOUNT}"
        umount ${MOZMOUNT}
        eend $?
    fi
}

load() {
    local size=$(get_size)

    if ! mountinfo -q ${MOZMOUNT}; then
        ebegin "Mounting ${MOZMOUNT}"
        checkpath -d ${MOZMOUNT}
        mount -t tmpfs -o size=${size}k tmpfs ${MOZMOUNT}
        eend $?
        
        service_set_value mnted YES
    else
        service_set_value mnted NO
    fi

    for u in $USERS; do
        ebegin "Setting moztmp for user $u"
        eindent
        set_folder $u
        eoutdent
        eend $?
    done
            
    return 0
}

start() {
    load
}

stop() {
    save
}

# vim:ft=gentoo-init-d